//@version=5

indicator('VitAlgo Oscillator', overlay=false)

//functions
xrf(values, length) =>
    r_val = float(na)
    if length >= 1
        for i = 0 to length by 1
            if na(r_val) or not na(values[i])
                r_val := values[i]
                r_val
    r_val
xsa(src, len, wei) =>
    sumf = 0.0
    ma = 0.0
    out = 0.0
    sumf := nz(sumf[1]) - nz(src[len]) + src
    ma := na(src[len]) ? na : sumf / len
    out := na(out[1]) ? ma : (src * wei + out[1] * (len - wei)) / len
    out

xfl(cond, lbk) =>
    out = 0.0
    itemp = 0
    for i = lbk to 0 by 1
        if itemp > 0
            out := 0.0
            itemp := itemp[1] - 1
            itemp
        else
            if cond[i] == false
                out := 0.0
                out
            else
                out := 1.0
                itemp := lbk + 1
                itemp
    out

// inputs
n1 = input.int(40, title='n1', minval=1)
n2 = input.int(3, title='n2', minval=1)
n3 = input.int(3, title='n3', minval=1)

rsv = (close - ta.lowest(low, n1)) / (ta.highest(high, n1) - ta.lowest(low, n1)) * 100
k = xsa(rsv, n2, 1)
d = xsa(k, n3, 1)
j = 3 * k - 2 * d

//plot KD candles
plotcandle(k, d, k, d, color=k >= d ? color.new(#15c02a, 20) : na)
plotcandle(k, d, k, d, color=d > k ? color.new(#b22833, 20) : na)

//threshold lines
h1 = hline(85, color=color.new(#57202c, 0), linestyle=hline.style_solid)
h2 = hline(15, color= color.new(#103c3c, 0), linestyle=hline.style_solid)
h3 = hline(5, color= color.new(#103c3c, 0), linestyle=hline.style_solid)
h4 = hline(95, color= color.new(#57202c, 0), linestyle=hline.style_solid)
//h5 = hline(50, color=color.rgb(112, 112, 112), linestyle=hline.style_solid)

// Money Flow

//-------------- MarketCipher B |  ------------//
// Get user input
version       = input.string("2.2.6", "Version")
useCurrentRes = input(true, "Use Current Chart Resolution?")
customRes     = input.timeframe("60", "Use Current Chart Resolution?")
obLevel1      = input(60, "Over Bought Level 1")
trigger1      = input(53, "Trigger 1")
osLevel1      = input(-60, "Over Sold Level 1")
trigger2      = input(-53, "Trigger 2")
// Functions
blueWaves_vwap(srcc, chlLen, avgLen) =>
    esa = ta.ema(srcc, chlLen)
    d = ta.ema(math.abs(srcc - esa), chlLen)
    ci = (srcc - esa) / (0.015 * d)
    bw1 = ta.ema(ci, avgLen)
    bw2 = ta.sma(bw1, 3)
    vwap = bw1 - bw2
    [bw1, bw2, vwap]
moneyFlow(period, mult, y) => ta.sma(((close - open) / (high - low)) * mult, period) - y
// Get components
cond(_offset) =>
    [bw1, bw2, vwap] = blueWaves_vwap(hlc3, 9, 12)
    moneyFlow = moneyFlow(60, 200, 2.25)
    rsiMod    = ta.sma(ta.stoch(close, high, low, 40), 2)
    stcRsiMod = ta.sma(ta.stoch(close, high, low, 81), 2)
    [bw1[_offset], bw2[_offset], vwap[_offset], moneyFlow[_offset], rsiMod[_offset], stcRsiMod[_offset]]
tf = useCurrentRes ? timeframe.period : customRes
[bw1, bw2, vwap, moneyFlow, rsiMod, stcRsiMod] = request.security(syminfo.tickerid, tf, cond(not useCurrentRes and barstate.isrealtime ? 1 : 0))
// Plots
//plot(bw1, "Lt Blue Wave", #90CAF9, 1, plot.style_area)
//plot(bw2, "Blue Wave", color.new(#0C47A1, 10), 1, plot.style_area)
//plot(vwap, "VWAP", color.new(color.yellow, 25), 1, plot.style_area)
plot(moneyFlow+50, "Mny Flow", moneyFlow > 0 ? color.new(#103c3c, 70) : color.new(#57202c, 70), 2, plot.style_area, histbase =50)
//plotshape(ta.crossover(bw1, bw2) and bw1 < osLevel1, "Buy", shape.circle, location.bottom, #3FFB03, size=size.tiny)
//plot(ta.crossover(bw1, bw2) ? bw2 : na, "Blue Wave Crossing UP", color.new(#01E676, 20), 3, plot.style_circles)
//plot(ta.crossunder(bw1, bw2) ? bw2 : na, "Blue Wave Crossing Down", color.new(color.red, 20), 3, plot.style_circles)
//plot(0, "Zero", color.white)
//plot(100, "100%", color.new(color.white, 50), 1, plot.style_circles)
//plot(obLevel1, "OB 1 Solid", color.new(color.white, 25), 2)
//plot(osLevel1, "OS 1 Solid", color.new(color.white, 25), 2)
//plot(trigger1, "Trigger 1", color.new(color.white, 50), 1, plot.style_circles)
//plot(trigger2, "Trigger 2", color.new(color.white, 50), 1, plot.style_circles)
//plot(rsiMod, "RSI", #E52BE6)
//plot(stcRsiMod, "Sto RSI", rsiMod > stcRsiMod ? #3FFB03 : #FE1000, 2)
//fill(p0, p1, moneyFlow > 0 ? color.new(#3FFB03, 70) : color.new(#FE1000, 70))
// Alerts
fill(h3, h2, rsiMod > stcRsiMod ? color.new(#103c3c, 60) : na)
fill(h1, h4, rsiMod < stcRsiMod ? color.new(#57202c, 60) : na)